﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestorSQL.BusinessEntities;
using GestorSQL.BLL;
using GestorSQL.GUI.Properties;
using System.Threading;

namespace GestorSQL.GUI
{
    public partial class AuthorizationWindow : Form
    {
        private ConnectionManager _connectionManager = new ConnectionManager();
        private SolutionManager _solutionManager = new SolutionManager();
        private SecurityManager _securityManager = new SecurityManager();
        private CaseManager _queryManager = new CaseManager();
        private ParameterManager _parameterManager = new ParameterManager();

        private Caso _casoAsginado = null;
        private Solucion _solucionActual = null;
        private bool isValidUser = false;

        #region Constructores
        public AuthorizationWindow()
        {
            InitializeComponent();
        }

        public AuthorizationWindow(string caseNumber)
        {
            CaseManager cm = new CaseManager();
            InitializeComponent();

            _casoAsginado = _queryManager.GetCase(caseNumber);
            _solucionActual = _solutionManager.GetSolucionByCase(_casoAsginado); ;

            cbTipoEjecucion.DataSource = new List<TipoEjecucion>() { TipoEjecucion.Automatico, TipoEjecucion.Manual };

            tbNumeroCaso.Text = _casoAsginado.NumeroCaso;
            tbCandenaConexion.Text = _connectionManager.GetConnectionStringByCase(_casoAsginado);

            if (_solucionActual.TipoEjecucion == (int)TipoEjecucion.Automatico)
                cbTipoEjecucion.SelectedIndex = 0;
            else
                cbTipoEjecucion.SelectedIndex = 1;

            dtimeFechaInicio.Value = _solucionActual.FechaInicio;
            dTimeFechaFin.Value = _solucionActual.FechaFin;
            tbUsuarioEjecutor.Text = _solucionActual.UsuarioEjecuta;

            AddAlerts();
        }

        #endregion

        #region Eventos

        private void tbUsuarioEjecutor_TextChanged(object sender, EventArgs e)
        {
            tbUsuarioEjecutor.Font = new Font(this.Font, FontStyle.Regular);
        }

        private void cbTipoEjecucion_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbTipoEjecucion.SelectedValue.Equals(TipoEjecucion.Automatico))
            {
                tbUsuarioEjecutor.Enabled = false;
                dTimeFechaFin.Enabled = false;
            }
            else
            {
                tbUsuarioEjecutor.Enabled = true;
                dTimeFechaFin.Enabled = true;
            }


        }

        private void btnVerQuery_Click(object sender, EventArgs e)
        {

            TextWindow textWindow = new TextWindow("Ver Query", _solutionManager.OpenSolutionQuery(_casoAsginado), "Query", true, true, false);
            textWindow.ShowDialog();
        }

        private void btnRechazar_Click(object sender, EventArgs e)
        {

            TextWindow textWindow = new TextWindow("Rechazo Solución", "", "Descripción del rechazo", false, false, true);
            if (textWindow.ShowDialog().Equals(DialogResult.OK) && !string.IsNullOrEmpty(textWindow.Texto))
            {
                _solutionManager.RechazarSolucion(_casoAsginado, textWindow.Texto);
                this.Close();
            }


        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            if (!ValidateForm())
                return;

            if (_securityManager.ExistUserOnGestorSQL(tbUsuarioEjecutor.Text))
            {
                _solucionActual.TipoEjecucion = (int)cbTipoEjecucion.SelectedValue;
                _solucionActual.FechaInicio = dtimeFechaInicio.Value;
                _solucionActual.FechaFin = dTimeFechaFin.Value;
                _solucionActual.UsuarioEjecuta = tbUsuarioEjecutor.Text;

                if (_solutionManager.AceptarSolution(_solucionActual).Equals(Resultado.Exitoso))
                {
                    this.DialogResult = DialogResult.OK;
                    this.Close();
                }
            }
            else
                MessageBox.Show("El usuario ejecutor no se encuentra en el Directorio Activo");

        }

        private void btnBuscarConexion_Click(object sender, EventArgs e)
        {

            ConnectionWindow connectionWindow = new ConnectionWindow(true);
            if (connectionWindow.ShowDialog().Equals(DialogResult.OK))
            {
                tbCandenaConexion.Text = _connectionManager.GetConnectionStringByConnection(connectionWindow.Connection);

                if (_solucionActual != null)
                    _solucionActual.FK_Conexion = connectionWindow.Connection.IdConexion;

            }

        }

        private void btnBuscarEjecutor_Click(object sender, EventArgs e)
        {
            ValidateUser();
        }

        #endregion

        #region Metodos Privados

        private bool ValidateForm()
        {
            //Conexion
            if (string.IsNullOrEmpty(tbCandenaConexion.Text))
            {
                if (MessageBox.Show(Resources.Solution_Validation, Resources.Autorization_WindowText, MessageBoxButtons.OK, MessageBoxIcon.Error) == DialogResult.OK)
                {
                    btnBuscarConexion.Focus();
                    return false;
                }
            }
            //Fechas
            if (DateTime.Compare(DateTime.Now, dtimeFechaInicio.Value) > 0
                || ((TipoEjecucion)cbTipoEjecucion.SelectedValue == TipoEjecucion.Manual &&
                DateTime.Compare(dtimeFechaInicio.Value, dTimeFechaFin.Value) > 0)
                )
            {
                if (MessageBox.Show(Resources.Solution_InvalidDate, Resources.Autorization_WindowText, MessageBoxButtons.OK, MessageBoxIcon.Error) == DialogResult.OK)
                {
                    dtimeFechaInicio.Focus();
                    return false;
                }
            }
            //Usuario
            if (!ValidateUser())
                return false;

            return true;
        }

        private bool ValidateUser()
        {
            isValidUser = false;
            tbUsuarioEjecutor.Font = new Font(this.Font, FontStyle.Regular);
            if (isValidUser = _securityManager.ExistUserOnGestorSQL(tbUsuarioEjecutor.Text))
                tbUsuarioEjecutor.Font = new Font(this.Font, FontStyle.Underline);
            else
                MessageBox.Show(string.Format(Resources.Autorization_InvalidUser, tbUsuarioEjecutor.Text), Resources.Autorization_WindowText, MessageBoxButtons.OK, MessageBoxIcon.Error);
            return isValidUser;
        }


        private void AddAlerts()
        {
            if (_casoAsginado != null)
                rtbAlertas.Text = _parameterManager.GetReservedWordsAlertsByQuery(_solutionManager.OpenSolutionQuery(_casoAsginado));


        }

        #endregion

    }
}
